package com.dao.impl;

import java.io.Serializable;
import java.util.List;

import org.apache.log4j.Logger;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.criterion.Restrictions;
import org.hibernate.criterion.SimpleExpression;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate3.SessionFactoryUtils;
import org.springframework.stereotype.Repository;

import com.bean.Usuario;
import com.dao.RegistroDao;
import com.util.Constants;

@Repository("UsuarioDaoImpl")
public class UsuarioDaoImpl implements RegistroDao {
	Logger log	= Logger.getLogger(UsuarioDaoImpl.class);
	
	@Autowired
	private SessionFactory	sessionFactory;
	
	
	@Override
	public boolean agregaRegistro(Object registro) {
		log.debug("begin");
		Usuario usuario;
		Session session	= SessionFactoryUtils.getSession(sessionFactory, true);
		Transaction tr	= session.beginTransaction();
		usuario	= (Usuario) registro;
		Serializable	result	= session.save(usuario);
		tr.commit();
		log.debug("finally");
		return result == null ? false: true;
	}

	@Override
	public boolean eliminaRegistro(Object registro) {
		log.debug("begin");
		Usuario usuario;
		Session session	= SessionFactoryUtils.getSession(sessionFactory, true);
		Transaction tr	= session.beginTransaction();
		usuario	= (Usuario) registro;	
		session.delete(usuario);
		tr.commit();
		log.debug("finally");
		return false;
	}

	@Override
	public void modificaRegistro(Object registro) {
		log.debug("begin");
		Usuario usuario;
		Session session	= SessionFactoryUtils.getSession(sessionFactory, true);
		Transaction tr	= session.beginTransaction();
		usuario	= (Usuario) registro;	
		session.saveOrUpdate(usuario);
		tr.commit();
		log.debug("finally");

	}

	@Override
	public Object buscaRegistroPorParametro(String param, Object registro) {
		log.debug("begin");
		Usuario usuario	= new Usuario();
		usuario	= (Usuario) registro;
		Session session	= SessionFactoryUtils.getSession(sessionFactory, true);
		Criteria criterio	= session.createCriteria(Usuario.class);
		log.debug("criterio de busqueda:"+generaCriterioDeBusqueda(param, usuario));
		criterio.add(generaCriterioDeBusqueda(param, usuario));
		log.debug("finally");
		return criterio.uniqueResult();
	}

	@SuppressWarnings("unchecked")
	@Override
	public <T> List<T> listaDeRegistros() {
		log.debug("begin");
		Session session	= SessionFactoryUtils.getSession(sessionFactory, true);
		Criteria criterio	= session.createCriteria(Usuario.class);
		log.debug("finally");
		return criterio.list();
	}
	
	
	private SimpleExpression generaCriterioDeBusqueda(String param, Usuario usuario){
		if (param.compareTo(Constants.ID) == 0){
			return Restrictions.eq(param.toLowerCase(), usuario.getIdUsuario());
		}
		if (param.compareTo(Constants.NOMBRE) == 0){
			return Restrictions.eq(param.toLowerCase(), usuario.getNombre());
		}
		if (param.compareTo(Constants.EDAD) == 0){
			return Restrictions.eq(param.toLowerCase(), usuario.getEdad());
		}
		if (param.compareTo(Constants.DIRECCION) == 0){
			return Restrictions.eq(param.toLowerCase(), usuario.getDireccion());
		}
		if (param.compareTo(Constants.SEXO) == 0){
			return Restrictions.eq(param.toLowerCase(), usuario.getSexo());
		}
		if (param.compareTo(Constants.TELEFONO) == 0){
			return Restrictions.eq(param.toLowerCase(), usuario.getTelefono());
		}
		if (param.compareTo(Constants.EMAIL) == 0){
			return Restrictions.eq(param.toLowerCase(), usuario.getEmail());
		}
		return null;
	}
}
